﻿using System;
using System.Collections.Generic;
using System.Data;
using System.Globalization;
using System.Windows.Forms;
using BadgeManager.Controller;
using BadgeManager.Model;

namespace Badge_Manager
{
    public partial class frmDettaglioAttivita : Form
    {
        private const string nomeform = "Attivita";
        private int oreGiorn;
        private DateTime data;
        private Guid Id;
        private List<Corso> elencoCorsi = new List<Corso>();
        private DataTable elencoAttivita = new DataTable();
        private List<Attivita> listaAttivita = new List<Attivita>();
        private Attivita attivita = new Attivita();
        private ctrlAttivita ctrlAttivita;
        private ctrlAttivitaDettaglio ctrlDettagli = new ctrlAttivitaDettaglio(null);
        private ctrlStanza controlStanza;
        private ctrlCorso controlCorso;
        private StatoForm status;

        #region costruttore

        public frmDettaglioAttivita(StatoForm statoForm, Guid id)
        {
            InitializeComponent();
            this.status = statoForm;
            controlCorso = new ctrlCorso();
            controlStanza = new ctrlStanza();
            elencoCorsi = controlCorso.SelectAll();
            this.Id = id;
            attivita.Id = id;
            ctrlAttivita = new ctrlAttivita(attivita);
            this.getCombo();
            CambiaStato(statoForm);
        }

        private void getCombo()
        {
            corsoCombo.DataSource = null;
            corsoCombo.DisplayMember = "nome";
            corsoCombo.ValueMember = "id";
            corsoCombo.DataSource = elencoCorsi;
            aulaCombo.DataSource = null;
            aulaCombo.DisplayMember = "numero";
            aulaCombo.ValueMember = "id";
            aulaCombo.DataSource = controlStanza.SelectAll();
        }

        #endregion costruttore

        private void CambiaStato(StatoForm status)
        {
            switch (status)
            {
                case StatoForm.Lettura:
                    this.Text = nomeform;
                    this.Text += " [Lettura]";
                    cmdCollegaPersona.Visible = true;
                    generaElencoBtn.Visible = false;
                    ClearBtn.Visible = false;
                    lblDaOra.Visible = false;
                    lblAOra.Visible = false;
                    break;
                case StatoForm.Nuovo:
                    this.Text = nomeform;
                    this.Text += " [Nuovo]";
                    cmdCollegaPersona.Visible = false;
                    break;
                case StatoForm.Modifica:
                    this.Text = nomeform;
                    this.Text += " [Modifica]";

                    attivita = ctrlAttivita.GetAttivitabyId(Id);
                    CaricaGriglia();
                    //elencoAttivita = controlAttivita.GetDettagliCorsoById(Id);
                    //dataGridViewAttivita.DataSource = elencoAttivita;
                    cmdCollegaPersona.Visible = true;
                    descrizioneTxt.Text = attivita.Descrizione;
                    corsoCombo.SelectedItem = attivita.Corso;
                    aulaCombo.SelectedValue = attivita.Stanza.Id;
                    unlimitedCheck.Checked = attivita.SenzaFine;
                    break;
            }
        }

        private void CaricaGriglia()
        {
            foreach (DettaglioAttivita dett in attivita.DettagliAttivita)
            {
                TimeSpan timeInizio = new TimeSpan(dett.OraInizio, dett.MinutiInizio, 0);
                TimeSpan timeFine = new TimeSpan(dett.OraFine, dett.MinutiFine, 0);
                dataGridViewAttivita.Rows.Add(dett.Giorno, timeInizio, timeFine);
            }
            AggiornaFormattazioneGriglia();
        }

        private void AggiornaFormattazioneGriglia()
        {
            dataGridViewAttivita.Columns["giornoColonna"].DefaultCellStyle.Format =
                CultureInfo.CurrentUICulture.DateTimeFormat.LongDatePattern;

            dataGridViewAttivita.Columns[1].DefaultCellStyle.Format =
                CultureInfo.CurrentUICulture.DateTimeFormat.ShortTimePattern;

            dataGridViewAttivita.Columns["oraFineColonna"].DefaultCellStyle.Format = CultureInfo.CurrentUICulture.DateTimeFormat.ShortTimePattern; ;
        }

        private void unlimitedCheck_CheckedChanged(object sender, EventArgs e)
        {
            corsoCombo.Enabled = !unlimitedCheck.Checked;
            riepilogoGrupBox.Enabled = !unlimitedCheck.Checked;
            dataGridViewAttivita.DataSource = null;
        }

        #region genera elenco

        private void generaElencoBtn_Click(object sender, EventArgs e)
        {
            dataGridViewAttivita.Rows.Clear();
            if (corsoCombo.Items.Count > 0)
            {
                data = elencoCorsi[corsoCombo.SelectedIndex].DataInizio;
                TimeSpan orediff = (dtOraA.Value - dtOraDa.Value);
                oreGiorn = Convert.ToInt16(orediff.Hours);
                int giorni = elencoCorsi[corsoCombo.SelectedIndex].NumeroOre / oreGiorn;
                if (giorni < 1)
                {
                    MessageBox.Show("Numero ore del corso insufficienti, inserire manualmente in elenco");
                }
                else
                {
                    for (int cont = 0; cont < giorni; cont++)
                    {
                        data = getGiornoDopoValido(data);
                        dataGridViewAttivita.Rows.Add(data.Date, dtOraDa.Value, dtOraA.Value);
                    }
                }
                lblOreMancanti.Text = "Ore Mancanti : ";
                lblOreMancanti.Text += Convert.ToString(elencoCorsi[corsoCombo.SelectedIndex].NumeroOre % oreGiorn);
            }
            else if (corsoCombo.Items.Count == 0)
            {
                MessageBox.Show("Inserire prima un corso o impostare attività a tempo indeterminato");
            }
            AggiornaFormattazioneGriglia();
        }

        #endregion genera elenco

        #region get giorno valido

        private DateTime getGiornoDopoValido(DateTime data)
        {
            data = data.AddDays(1);
            if (data.DayOfWeek == DayOfWeek.Saturday)
            {
                //se è sabato aggiunge 2 giorni
                return data.AddDays(2);
            }
            else if (data.DayOfWeek == DayOfWeek.Sunday)
            {
                return data.AddDays(1);
            }
            else
            {
                return data;
            }
        }

        #endregion get giorno valido

        #region salva

        private void salvaBtn_Click(object sender, EventArgs e)
        {
            //foreach (DettaglioAttivita dett in attivita.DettagliAttivita)
            //    ctrlDettagli.CancellaRiga(dett.Id);

            DettaglioAttivita dettaglioAttivita = new DettaglioAttivita();
            ctrlAttivitaDettaglio ctrlAttDett;

            int ora, minuti;
            if (unlimitedCheck.Checked == true) //se attività a tempo indeterminato
            {
                if (status == StatoForm.Nuovo)
                    attivita.Id = Guid.NewGuid();

                attivita.Descrizione = descrizioneTxt.Text;
                attivita.SenzaFine = unlimitedCheck.Checked;
                attivita.Stanza.Id = (Guid)aulaCombo.SelectedValue;
                attivita.DettagliAttivita = null;

                if (ctrlAttivita.Inserisci() == 1)
                    MessageBox.Show("ATTIVITA OK");
            }
            else
            {
                if (status == StatoForm.Nuovo)
                    attivita.Id = Guid.NewGuid();

                attivita.Corso = new Corso() { Id = (Guid)corsoCombo.SelectedValue };
                attivita.Descrizione = descrizioneTxt.Text;
                attivita.SenzaFine = unlimitedCheck.Checked;
                attivita.Stanza = new Stanza() { Id = (Guid)aulaCombo.SelectedValue };
                attivita.DettagliAttivita = new List<DettaglioAttivita>();
                for (int i = 0; i < dataGridViewAttivita.Rows.Count; i++)
                {
                    dettaglioAttivita = new DettaglioAttivita();
                    dettaglioAttivita.Id = Guid.NewGuid();
                    dettaglioAttivita.Giorno = (DateTime)dataGridViewAttivita["giornoColonna", i].Value;
                    ora = ((TimeSpan)dataGridViewAttivita["OraInizioColonna", i].Value).Hours;
                    minuti = ((TimeSpan)dataGridViewAttivita["OraInizioColonna", i].Value).Minutes;
                    dettaglioAttivita.OraInizio = ora;
                    dettaglioAttivita.MinutiInizio = minuti;
                    ora = ((TimeSpan)dataGridViewAttivita["OraFineColonna", i].Value).Hours;
                    minuti = ((TimeSpan)dataGridViewAttivita["OraFineColonna", i].Value).Minutes;
                    dettaglioAttivita.OraFine = ora;
                    dettaglioAttivita.MinutiFine = minuti;
                    attivita.DettagliAttivita.Add(dettaglioAttivita);
                }

                if (status == StatoForm.Nuovo && ctrlAttivita.Inserisci() == 1)
                {
                    MessageBox.Show("ATTIVITA OK");
                }
                else if (status == StatoForm.Modifica)
                {
                    if (ctrlAttivita.Update() > -1)
                        MessageBox.Show("ATTIVITA OK");
                    else
                        MessageBox.Show("errore");
                }

                ctrlAttDett = new ctrlAttivitaDettaglio(attivita);
                if (ctrlAttDett.Inserisci() > -1)
                {
                    MessageBox.Show("DETT ATT OK");
                }
                else if (ctrlAttDett.Inserisci() == -1)
                {
                    //cancelalre tutti i dettagli inseriti prima dell'errore
                    ctrlAttivita.Delete(attivita);
                }

                //DialogResult ris = MessageBox.Show("Vuoi collegare le persone? Oppure vuoi collegarle in un secondo momento?.","Attenzione",MessageBoxButtons.YesNo,MessageBoxIcon.Question);
                //if (ris == DialogResult.Yes)
                //{
                //    frmAggiungiAlunni frm = new frmAggiungiAlunni(StatoForm.Modifica);
                //    frm.IdAttivita = attivita.Id;
                //    frm.MdiParent = this.MdiParent;
                //    frm.Show();
                //    this.Close();
                //}
            }
        }

        #endregion salva

        #region cancella

        private void cmdCancellaGiorno_Click(object sender, EventArgs e)
        {
            if (dataGridViewAttivita.Rows.Count > 0)
            {
                TimeSpan tmp = ((TimeSpan)dataGridViewAttivita.CurrentRow.Cells[2].Value).Subtract((TimeSpan)dataGridViewAttivita.CurrentRow.Cells[1].Value);
                int orediff = tmp.Hours;
                dataGridViewAttivita.Rows.Remove(dataGridViewAttivita.CurrentRow);

                if (orediff % oreGiorn == 0)
                {
                    //un giorno
                    data = getGiornoDopoValido(data);
                    dataGridViewAttivita.Rows.Add(data, dtOraDa.Value.TimeOfDay, dtOraA.Value.TimeOfDay);
                }
                else
                {
                    int t = oreGiorn - orediff;
                    data = getGiornoDopoValido(data);
                    dataGridViewAttivita.Rows.Add(data, dtOraDa.Value.TimeOfDay, dtOraDa.Value.AddHours(t).TimeOfDay);
                }
            }
            AggiornaFormattazioneGriglia();
        }

        #endregion cancella

        private void ClearBtn_Click(object sender, EventArgs e)
        {
            dataGridViewAttivita.DataSource = null;
            dataGridViewAttivita.Rows.Clear();
        }

        private void frmDettaglioAttivita_Load(object sender, EventArgs e)
        {
        }

        private void tbChiudi_Click(object sender, EventArgs e)
        {
            this.Close();
        }

        private void tbSfogliaAttivita_Click(object sender, EventArgs e)
        {
            //frmElencoAttivita frm = new frmElencoAttivita();
            //frm.ShowDialog();
            //this.CambiaStato(StatoForm.Modifica);
        }

        private void cmdCollegaPersona_Click(object sender, EventArgs e)
        {
            //frmAggiungiAlunni frm = new frmAggiungiAlunni(StatoForm.Modifica);
            //frm.IdAttivita = attivita.Id;
            //frm.MdiParent = this.MdiParent;
            //frm.Show();
        }

        private void btnModificaOrario_Click(object sender, EventArgs e)
        {
            if (dataGridViewAttivita.Rows.Count > 0
                && dataGridViewAttivita.SelectedRows.Count == 1)
            {
                dataGridViewAttivita.CurrentRow.Cells["oraInizioColonna"].Value = dtOraDa.Value;
                dataGridViewAttivita.CurrentRow.Cells["oraFineColonna"].Value = dtOraA.Value;
            }
            else
            {
                MessageBox.Show("La lista è vuota, impossibile modificare");
            }
        }
    }
}